/**
 * @file testsdlib.c
 * @brief Source file utilizzato come testing per sdlib.
 *
 * Attualmente contiene tutti i testing implementati.
 *
 * @date Feb 27, 2012
 * @author Francesco Corvino
 */
#include "ctesting.h"
#include "../envFactory.h"

void exLoadLibrary(){
	char path[255], name[255];
	// richiede i parametri
	AppLib_writeToHost("Percorso alla libreria?");
	AppLib_readFromHost(path,255);
	AppLib_writeToHost("Nome della libreria?");
	AppLib_readFromHost(name,255);

	// esegue il caricamento della libreria
	DescrLib* newLib = SDLIB_create(name,path);

	if(newLib==NULL) {
		AppLib_writeToHost("Errore - non è possibile caricare la libreria!");
		return ;
	}
	char msg[255];
	sprintf(msg,"%s - Caricata!", newLib->name);
	AppLib_writeToHost(msg);

	int i, numfn = newLib->functions.numelement;

	if(numfn==0) {
		sprintf(msg,"%s - Nessuna funzione individuata ", newLib->name );
		AppLib_writeToHost(msg);
		return;
	}

	sprintf(msg,"%s - Individuate %d funzioni", newLib->name , newLib->functions.numelement);
	AppLib_writeToHost(msg);

	for (i=0;i<newLib->functions.numelement;i++){
		DescrFun* fn = (DescrFun*) DynArray_getIndex(&(newLib->functions),i);
		sprintf(msg, "%s - fun%d %s: type %d",
				newLib->name, i, fn->name, fn->type);
		AppLib_writeToHost(msg);
	}

}

void exTestParams(){
	HostSession* session = AppLib_getMySession();
	// individua tramite la chiave di sessione la richiesta corrente
	UserRequest* req = RscApp_getRequest(session->keySession);

	int i, numP = req->params.numelement;
	for(i=0;i<numP;i++){
		UserParam * p = (UserParam*) DynArray_getIndex(&(req->params),i);
		AppLib_writeToHostF("Inserito il parametro <%s> con valore <%s> \n",
				p->name, p->value);
	}

}

void exTestSessionAttr() {
	HostSession* session = AppLib_getMySession();
	CMap *attr =&(session->attributes);
	int i, numP = CMap_size(attr);
	AppLib_writeToHostF("Presenti %d attributi: {chiave-dimensione} = ",numP);
	for(i=0;i<numP;i++){
		CMapElem * p = (CMapElem*) DynArray_getIndex(&(attr->values),i);
		AppLib_writeToHostF("<%d-%d bytes> ",
				p->key, p->dimdata);
	}
	AppLib_writeToHost("\n");
}

static int _addingKey=0; char _addingTest[255];

void exTestSessionAttrAdd() {
	HostSession* session = AppLib_getMySession();
	CMap *attr =&(session->attributes);

	sprintf(_addingTest,"%dAttributoKey",_addingKey);
	CMap_set(attr,CMap_StringHash(_addingTest),_addingTest,255);
	_addingKey++;

	int i, numP = CMap_size(attr);
	AppLib_writeToHostF("Presenti %d attributi: {chiave-dimensione} = ",numP);
	for(i=0;i<numP;i++){
		char _valStrCpy[10]; _valStrCpy[9]= '\0';
		CMapElem * p = (CMapElem*) DynArray_getIndex(&(attr->values),i);
		strncpy(_valStrCpy,p->data,9);
		AppLib_writeToHostF("<%d - %d bytes:%s> ",
				p->key, p->dimdata, _valStrCpy);
	}
	AppLib_writeToHost("\n");
}

#define NUM_COMMAND_DEFINED 4

SimpleDescCommand defcmdtest[] = {
		{"load","Carica una libreria dinamica nell'applicazione",exLoadLibrary},
		{"testparams","Controlla i parametri inseriti nella richiesta",exTestParams},
		{"testAttr","Controlla gli attributi di sessione",exTestSessionAttr},
		{"testAttrAdd","Aggiunge un attributo e poi controlla gli attributi in sessione",exTestSessionAttrAdd}
};

void testsdlib_LoadAllCommands(){
	int i;
	for(i=0;i<NUM_COMMAND_DEFINED;i++){
		HiddenType helpfnc = { (void*) defcmdtest[i].helpstr, getHiddenTypeToString };
		InterfaceCommand regcmd;
		Command_initComplete(&regcmd, defcmdtest[i].namecmd,defcmdtest[i].execfnc,&helpfnc,NULL);
		envFact_registerCMD(&regcmd);
	}
}


